package com.example.horton.charttest;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;


import java.util.ArrayList;
import java.util.List;
import java.util.Random;


/**
 * 大家好 今天给大家录得视频是利用第三方库MPAndroidChart绘画出柱状图
 * 其中涉及的数据均为模拟数据
 * 首先我们导入一下maven
 * maven{url('http://jitpack.io')}
 *然后我们添加一下依赖
 * implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
 * 好的现在添加了依赖  同步一下
 * 等待同步的过程。。。。好烦躁
 * 现在同步完成，我们开始设计界面，这里我们简单设计一下ui
 * 现在我们设计好了一个简单的界面，接着我们开始编写业务代码
 */


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BarChart barChart = findViewById(R.id.ChartTest);   //这里我们定义一下我们界面的控件
        barChart = initBarChart(barChart);                  //这里调用方法初始化柱状图
        BarData barData = setBardata(barChart);             //这里调用方法初始化模拟数据
        barChart.setData(barData);                          //这里将模拟数据用于柱状图，在柱状图显示
        barChart.animateY(2000);                //动态显示


        //关键： (0.23 + 0.00) * 3 + 0.31 = 1.00 -> interval per "group" 一定要等于1,乘以3是表示每组有三个数据
        float groupSpace = 0.31f;
        float barSpace = 0.00f;


        barChart.groupBars(0.0f, groupSpace, barSpace);//最关键，分组柱状图一定要增加这个配置，且要在setData之后调用否则会程序崩溃
        barChart.setFitBars(true);

        barChart.invalidate();      //这里让柱状图在填充数据后刷新
        //到这里基本完成了柱状图的初步使用，如果想要再深一步的学习MPAndroidChart的使用，请关注我，谢谢
        //下面进行一下测试，看是否能够成功显示，这里up主使用的是mumu模拟器
        //在cmd中使用adb connect 127.0.0.1:7555就可以将mumu模拟器和Android studio相连接
        //等待的过程。。。还是很烦躁
        //数据成功显示，谢谢大家的耐心观看。。。。。
    }


    /**
     * 这个方法用于设置柱状图数据
     * @return
     */
    public BarData setBardata(BarChart barChart){
        List<BarEntry> entries = new ArrayList<>();//这里定义一个存放数据的容器
        //这里用for循环为容器填充数据
        //这里填充了12个200以内的随机数
        for(int i = 0;i < 12;i++){
            entries.add(new BarEntry(i,new Random().nextInt(200)));
        }

        List<BarEntry> entries2 = new ArrayList<>();
        for( int j=0; j<12; j++ ){
            entries2.add(new BarEntry(j,new Random().nextInt(200)));
        }

        List<BarEntry> entries3 = new ArrayList<>();
        for( int k=0; k<12; k++ ){
            entries3.add(new BarEntry(k,new Random().nextInt(200)));
        }

//        BarDataSet barDataSet = new BarDataSet(entries,"测试用数据ccc");    //这里设置了数据集
//        BarData barData = new BarData(barDataSet);

        BarDataSet set1;
        set1 = new BarDataSet(entries, "电量A(kWh)");//(BarDataSet)barChart.getData().getDataSetByIndex(0);
        //set1.setValues(entries);
        set1.setColor(Color.YELLOW);//   setGradientColors(gradientColors);
        set1.setLabel("A相(kWh)");
        set1.setValueTextColor(Color.YELLOW);
        set1.setValueTextSize(20);

        BarDataSet set2;
        set2 = new BarDataSet(entries2, "电量B(kWh)");//(BarDataSet)barChart.getData().getDataSetByIndex(0);
        //set2.setValues(entries);
        set2.setColor(Color.GREEN);
        set2.setLabel("B相(kWh)");
        set2.setValueTextColor(Color.GREEN);
        set2.setValueTextSize(20);

        BarDataSet set3;
        set3 = new BarDataSet(entries3, "电量B(kWh)");//(BarDataSet)barChart.getData().getDataSetByIndex(0);
        //set2.setValues(entries);
        set3.setColor(Color.RED);
        set3.setLabel("C相(kWh)");
        set3.setValueTextColor(Color.RED);
        set3.setValueTextSize(20);


//        ArrayList<IBarDataSet> dataSets = new ArrayList<>();
//        dataSets.add(set1);
//        dataSets.add(set2);
//        BarData barData = new BarData(dataSets);
        BarData barData = new BarData( set1, set2, set3 );
        barData.setDrawValues(false);
        barData.setValueTextSize(15f);
        float barWidth = 0.23f;
        barData.setBarWidth(barWidth);

        return barData;//返回可用于柱状图的数据
    }

    public  BarData setBardataMulti(){
        return null;
    }

    /**
     * 这个方法用于初始化柱状图
     * @return
     */
    public BarChart initBarChart(BarChart barChart){    //首先传入一个柱状图实例
        barChart.setDescription(null);           //这里设置柱状图的解释性文字为空
        barChart.setDrawBarShadow(false);        //设置柱状图每一条柱子的阴影不显示
        barChart.setDrawValueAboveBar(true);     //设置柱状图每一条柱子的数值显示在柱子上方
        //barChart.setBackgroundColor( Color.BLACK );

        //设置悬浮提示，当点击柱状图中当任意一条柱子时，显示柱子的当前数值
        CustomMPLineChartMarkerView mv = new CustomMPLineChartMarkerView(this);
        mv.setChartView(barChart);
        barChart.setMarker(mv);

        XAxis xAxis = barChart.getXAxis();          //获取柱状图的x轴
        YAxis yAxisLeft = barChart.getAxisLeft();   //这里获取了柱状图左侧的y轴
        YAxis yAxis1Right = barChart.getAxisRight();//这里获取了柱状图右侧的y轴
        setAxis(xAxis,yAxisLeft,yAxis1Right);       //这里调用方法设置柱状图的轴线属性

        return barChart;        //这里返回初始化完成的柱状图实例
    }

    /**
     * 这个方法用于设置柱状图的X轴Y轴
     */
    public void setAxis(XAxis xAxis,YAxis leftYaxis,YAxis rightYaxis){
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);  //这里设置x轴在柱状图底部显示
        xAxis.setAxisLineWidth(1);        //这里设置x轴宽度
        xAxis.setAxisMinimum(0);          //这里设置x轴从0刻度开始绘画
        xAxis.setAxisMaximum(12);         //关键：差值为x轴数据个数，也是y轴数据的组数
        xAxis.setDrawAxisLine(true);      //这里设置x轴显示轴线
        xAxis.setDrawGridLines(false);    //这里设置x轴的表格线不显示
        xAxis.setTextColor(Color.RED);
        xAxis.setTextSize(20);
        xAxis.setCenterAxisLabels(true);
        xAxis.setLabelCount(12,false);   //设置X轴标签个数，这里有12个月，因此设为12；默认只有6个；

        xAxis.setValueFormatter( new CustomXValueFormatter(true) );
        xAxis.setGranularity(1f);          //最小颗粒度，会影响x轴的坐标计算
        xAxis.setEnabled(true);            //这里设置x轴显示

        int count = xAxis.getLabelCount();
        Log.d( "cccc", "xAxis label count: " + count );

        // 左侧Y轴
        leftYaxis.setAxisMinimum(0);        //设置y轴从0刻度开始
        leftYaxis.setDrawGridLines(true);   //设置y轴的表格线不显示
        leftYaxis.setDrawAxisLine(true);    //设置y轴显示轴线
        leftYaxis.setAxisLineWidth(1);      //设置y轴宽度
        leftYaxis.setTextColor(Color.RED);  //设置y轴刻度的文字颜色
        leftYaxis.setTextSize(20);          //设置y轴刻度的文字大小
        leftYaxis.setEnabled(true);         //设置左侧的y轴显示

        //右侧Y轴
        rightYaxis.setAxisMinimum(0);       //设置y轴从0刻度开始
        rightYaxis.setDrawGridLines(false); //这里设置y轴的表格线不显示
        rightYaxis.setDrawAxisLine(true);   //这里设置y轴显示轴线
        rightYaxis.setAxisLineWidth(1);     //这里设置y轴宽度
        rightYaxis.setEnabled(false);       //这里设置右侧的y轴不显示
    }


}
